var fs = require('fs')
var path = require('path')
var querystring = require('querystring')
var config = require('./config.js')

module.exports.index = function(req, res){
	// 1.读取 index.html 并返回
	newReadFile(config.dbPath, function(list){
		res.render(path.join(config.viewPath, 'index.html'), {list:list})
	})
}

module.exports.submit = function(req, res){
	// 读取 submmit.html 并返回
	res.render(path.join(config.viewPath, 'submit.html'))
}

module.exports.item = function(req, res){
	// 读取 details.html 并返回
	newReadFile(config.dbPath, function(list){
		if (list.length <= 0) {
			return res.end('No such item.')
		}
		var id = parseInt(req.query.id)
		var model = null
		for (var i = 0; i < list.length; i++) {
			if (list[i].id === id) {
				model = list[i]
				break
			}
		}
		if ( ! model) {
			return res.end('No such item.')
		}
		res.render(path.join(config.viewPath, 'details.html'), {item : model})
	})
}

module.exports.addGet = function(req, res){
	// 读取 get 方法提交一条新闻
	newReadFile(config.dbPath, function(list){
		var obj = req.query
		obj.id = list.length

		list.push(obj)
		newWriteFile(JSON.stringify(list), function(){
			res.statusCode = 302
			res.statusMessage = 'Found'
			res.setHeader('Location', '/')
			res.end()
		})
	})
}

module.exports.addPost = function(req, res){
	// 读取 post 方法提交一条新闻
	newReadFile(config.dbPath, function(list){
		postBody(req, function(postBody){
			postBody.id = list.length
			list.push(postBody)

			newWriteFile(JSON.stringify(list), function(){
				res.statusCode = 302
				res.statusMessage = 'Found'
				res.setHeader('Location', '/')
				res.end()
			})
		})
	})
}

module.exports.go404 = function(req, res){
	res.writeHead(404, 'Not Found', {
		'Content-Type' : 'text/html;charset=utf-8'
	})
	res.end('404, Page Not Found')
}

module.exports.static = function(req, res){
	res.render(path.join(__dirname, req.pathname))
}

function postBody(req, callback){
	// 声明一个数组，用户保存用户每次提交过来的数据
	var array = []
	req.on('data', function(chunk){
		// 此处的 chunk 参数，就是浏览器本次提交过来的一部分数据
		// chunk的数据类型是 Buffer (chunk就是一个Buffer对象)
		array.push(chunk)
	})
	// 监听 request 对象的 end 事件
	// 当 end 事件被触发的时候，表示所有数据都已经提交完毕了
	req.on('end', function(){
		// 在这个事件中只要把 array 中的所有数据汇总起来就好了
		// 把 array 中的每个buffer对象，集合起来转换为一个buffer对象
		var postBody = Buffer.concat(array)
		postBody = postBody.toString('utf8')
		postBody = querystring.parse(postBody)

		callback(postBody)
	})
}

function newReadFile(filename, callback){
	fs.readFile(filename, 'utf8', function(err, data){
		// 因为第一次访问网站，data.json文件本身就不存在，所以肯定是有错误的
			// 但是这种错误，我们并不认为是网站出错了，所以不需要抛出异常
		if(err && err.code != 'ENOENT'){
			throw err
		}
		var list = JSON.parse(data || '[]')
		callback(list)
	})
}

function newWriteFile(data, callback){
	fs.writeFile(config.dbPath, data, function(err){
		if (err) {
			throw err
		}
		callback()
	})
}